#pragma once
#include "common.hpp"

const int defaultfd = -1;

class namepipe
{
public:
    namepipe(const std::string &filename) : _filename(filename),_fd(defaultfd)
    {}
    bool InitNamepipe()
    {
        int n = mkfifo(filename.c_str(), mode);
        if (n == 0)
        {
            std::cout << "mkfifo success " << std::endl;
        }
        else
        {
            perror("mkfifo");
            return false;
        }
        return true;
    }

    bool OpenForRead()
    {
        _fd = open(filename.c_str(), O_RDONLY);
        if (_fd < 0)
        {
            perror("open");
            return false;
        }
        else
        {
            std::cout << "open success: " << _fd << std::endl;
        }
        return true;
    }

    bool OpenForWrite()
    {
        _fd = open(filename.c_str(), O_WRONLY);
        if (_fd < 0)
        {
            perror("open");
            return false;
        }
        else
        {
            std::cout << "open success: " << _fd << std::endl;
        }
        return true;
    }

    // void Write()
    // {
    //     std::string message;
    //     while (true)
    //     {
    //         std::cout << "Please Enter#: " << std::endl;
    //         std::getline(std::cin, message);
    //         int k = write(_fd, message.c_str(), message.size());
    //     }
    // }
    void Write(const std::string &in)
    {
        write(_fd, in.c_str(), in.size());
    }

    // void Read()
    // {
    //     char buffer[size] = {0};
    //     while (true)
    //     {
    //         buffer[0] = 0;
    //         ssize_t k = read(_fd, buffer, sizeof(buffer) - 1);
    //         if (k > 0)
    //         {
    //             buffer[k] = 0;
    //             std::cout << "clinet say:#" << " " << buffer << std::endl;
    //         }
    //         else if (k == 0)
    //         {
    //             std::cout << "write out,me too" << std::endl;
    //             break;
    //         }
    //     }
    // }

    bool Read(std::string *out)
    {
        char buffer[size] = {0};
        ssize_t num = read(_fd, buffer, sizeof(buffer) - 1);
        if (num > 0)
        {
            buffer[num] = 0;
            *out = buffer;
        }
        else if (num == 0)
        {
            std::cout << "write out,me too" << std::endl;
            return false;
        }
        else
        {
            return false;
        }
        return true;
    }

    void Close()
    {
        if(_fd==defaultfd)
            return;
        else
            close(_fd);
    }
    
    void Remove()
    {
        int m=unlink(_filename.c_str());
        (void)m;
    }
    ~namepipe()
    {
    }

private:
    std::string _filename;
    int _fd;
};